#ifndef BASEPLATE_H
#define BASEPLATE_H

#include <iostream>
#include <fstream>
#include "../observer/observer.h"

/*
    底盘模块中增加观察者，向雷达模块进行订阅注册，并接收订阅通知。
    这里增加一个决策类,根据传过来的障碍物状态,进行不同的决策
*/
class Decision : public Observer
{
public:
    void Update(int subState);
};

// 底盘类
class BasePlate
{
    // 私有属性，直接把之前的struct的内容copy过来
private:
    std::string id;        // 编号
    std::string model;     // 型号
    int wheelbase;         // 轴距（mm）
    int track;             // 轮距（mm）
    int groundClearance;   // 最小离地间隙（mm）
    int turningRadius;     // 最小转弯半径（m）
    std::string driveType; // 驱动形式
    int maxRange;          // 最大行程（km）

    // 只有底盘有轮胎属性，直接定义在内部
    struct Tire
    {
        std::string modelT; // 型号
        int size;           // 尺寸（mm）
    };
    Tire tires[4]; // 轮胎（4个）
    // 底盘模块增加的观察者
    Observer *decision = new Decision();
public:
    Observer *getDecision(){
        return decision;
    }

    // 构造函数
    BasePlate();

    // 属性设置方法
    void setId(const std::string &id);
    void setModel(const std::string &model);
    void setWheelbase(int wheelbase);
    void setTrack(int track);
    void setGroundClearance(int groundClearance);
    void setTurningRadius(int turningRadius);
    void setDriveType(const std::string &driveType);
    void setMaxRange(int maxRange);
    void setTire(int index, const std::string &modelT, int size);

    // 屏幕输出
    void print();
    // 本地文件保存
    void save(const std::string &filename);
};

#endif